/**
 * 处理页面返回结果处理类
 */
package org.longteng.core.base;

/**
 * 登录取token返回结果处理类
 * 200：成功；
 * 401：token验证失败；
 * 402：用户验证失败；
 * 500：服务器异常；
 * 5000：输入参数不完整
 * @author Hymn
 *
 */
public class TokenResult<T> {
    /**成功标识*/
    private boolean success;   // 成功标识
    /**
     * 返回代码
     */
    private String code;       // 返回代码
    /**
     * 提示或错误信息
     */
    private String message;  // 提示或错误信息 供电接口文档2.1是msg，2.2是message
    /**
     * token数据
     */
    private TokenData data;

    public TokenResult() {
    }

    protected TokenResult(boolean success,String code, String message, TokenData data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    private TokenResult(Builder builder) {
        this.success = builder.success;
        this.code = builder.code;
        this.message = builder.message;
        this.data = builder.data;
    }


    /**
     * 构建结果结果
     *
     * @param code
     */
    public static Builder toBuilder(boolean success,String code) {
        return new TokenResult.Builder(success,code);
    }

    /**
     * 成功返回结果
     */
    public static  TokenResult success() {
        return new TokenResult(true, "200", "登录成功",null);
    }

    /**
     * 成功返回结果
     * @param data
     * @return
     */
    public static  TokenResult success(TokenData data) {
        return new TokenResult(true, "200", "登录成功",data);
    }
    /**
     * 成功返回结果
     * @param msg 提示信息
     * @param data  获取的数据
     */
    public static TokenResult success(String msg, TokenData data) {
        return new TokenResult(true, "200", msg, data);
    }

    /**
     * 失败返回结果
     *
     * @param msg 提示信息
     */
    public static TokenResult failed(String msg) {
        return new TokenResult(false, "402",msg, null);
    }
 
    /**
     * 失败返回结果
     */
    public static  TokenResult failed() {
        return new TokenResult(false, "402", "用户验证失败", null);
    }

    public boolean getSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }
 
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
 
    public TokenData getData() {
        return data;
    }
 
    public void setData(TokenData data) {
        this.data = data;
    }

    /**
     * token验证后的返回数据
     */
    public static class TokenData {
        /**
         * token值
         */
        String token;    // 用于身份识别
        /**
         * 用于其他接口的请求参数加密的公钥
         */
        String pk;       // 用于其他接口的请求参数加密的公钥

        /**
         * 依token生成返回类
         * @param token
         * @param pk
         * @return
         */
        public static TokenData buildData(String token, String pk) {
            TokenData tokenData = new TokenData();
            tokenData.setToken(token);
            tokenData.setPk(pk);
            return tokenData;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }

        public String getPk() {
            return pk;
        }

        public void setPk(String pk) {
            this.pk = pk;
        }

    }

    /**
     * Builder模式构建
     */
    public static class Builder {
        private boolean success;   // 成功标识
        private final String code;       // 返回代码;

        //可选参数
        private String message;  // 返回信息;
        private TokenData data;

        public Builder(boolean success,String code) {
            this.success = success;
            this.code = code;
        }

        public Builder msg(String message) {
            this.message = message;
            return this;
        }

        public Builder data(TokenData data) {
            this.data = data;
            return this;
        }
        public Builder token(String token) {
            if (this.data == null) {
                this.data = new TokenData();
            }
            this.data.setToken(token);
            return this;
        }
        public Builder pk(String pk) {
            if (this.data == null) {
                this.data = new TokenData();
            }
            this.data.setPk(pk);
            return this;
        }

        public TokenResult build() {
            return new TokenResult(this);
        }
    }
}
